package com.conlin.learn.common.proxy.handler;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class LoggingInvocationHandler implements InvocationHandler {

    private final Object target;

    public LoggingInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 记录方法开始时间
        long startTime = System.currentTimeMillis();
        System.out.println("方法 " + method.getName() + " 开始执行...");

        // 调用目标方法
        Object result = method.invoke(target, args);

        // 记录方法结束时间
        long endTime = System.currentTimeMillis();
        System.out.println("方法 " + method.getName() + " 执行完毕，耗时: " + (endTime - startTime) + " 毫秒");
        return result;
    }

    // 创建代理对象
    public static <T> T createProxy(T target, Class<T> interfaceType) {
        Object proxy = Proxy.newProxyInstance(
                interfaceType.getClassLoader(),
                new Class<?>[]{interfaceType},
                new LoggingInvocationHandler(target)
        );

        // 使用 Class.cast() 进行类型安全的转换
        return interfaceType.cast(proxy);
    }
}
